////类中有指针成员，默认拷贝构造会有浅拷贝缺陷,浅拷贝只拷贝地址
//#include <iostream>
//#include <cstring>
//
//using namespace std;
//
////模拟C++标准的string类实现自己的string类
//class String {
//public:
//    String(const char *psz = "") : m_psz(new char[strlen(psz) + 1]) {
//        strcpy(m_psz, psz);
//    }
//
//    ~String() {
//        delete[] this->m_psz;
//        //释放m_psz本身所占内存空间
//    }
//
//    char *c_str() {
//        return m_psz;
//    }
//    //深拷贝构造函数(体现的是资源的重建)
//    String(/*String* this*/const String &that) : m_psz(new char[strlen(that.m_psz)] + 1) {
//        //【char* m_psz = new char[strlen(that.m_psz)+1];】
//        strcpy(m_psz, that.m_psz);//不复制地址，复制地址指向的数据 -->深拷贝
//        cout << "String类的拷贝构造函数被调用" << endl;
//    }
//    //转移构造函数（体现的是资源的转移）
//    String(/*String* this */String&& that) :m_psz(that.m_psz) {
//        //[char* m_psz = that.m_psz]只复制了地址，没有复制地址指向的数据
//        that.m_psz = NULL;
//        cout << "String类的转移构造函数被调用" << endl;
//    }
//
//    //默认的拷贝复赋值函数
////    String& operator = (const String& that){
////        this->m_psz = that.m_psz;//只复制了地址，没有复制地址指向的数据 -->浅拷贝
////        return * this;
////    }
//    //深拷贝赋值（体现的是资源的重建）
//    String &operator=(/*String* this*/const String &that) {
//        cout << "String类的拷贝赋值函数被调用" << endl;
//        if (this != &that) {//防止自赋值
//            delete[] this->m_psz;//释放旧资源
//            this->m_psz = new char[strlen(that.m_psz) + 1];//申请新资源
//            strcpy(m_psz, that.m_psz);//拷贝新数据
//        }
//        return *this;//返回自引用
//    }
//    //转移赋值函数（体现出的是资源的转移）
//    String& operator=(/*String* this*/String&& that) {
//        cout << "String类的转移赋值函数被调用" << endl;
//        delete[] this->m_psz;
//        this->m_psz = that.m_psz;//只复制了地址，没有复制地址指向的数据
//        that.m_psz = NULL;
//        return *this;
//    }
//private:
//    char *m_psz;
//};
//
//int main(void) {
//    String s1("Hello");
//    cout << "-------------------1------------" << endl;
//    String s2(s1);//定义s2,利用s2.String(s1)-->拷贝构造函数
//
//
//    cout << "---------------------2-----------" << endl;
//    String s3=String("World");//定义s3,利用s3.String(String("World))--转移构造（性能上提高）
//
//    cout << "================3=========" << endl;
//    String s4;
//    s4 = s3;//s4.operator=(s3)--深拷贝赋值
//
//    cout << "================4=========" << endl;
//    s4 = String("world");//s4.operator(String("World")));--深拷贝赋值
//    
//
//    return 0;
//}